package trunk.control;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.net.InetAddress;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.event.MouseInputListener;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
//import org.apache.commons.mail.EmailException;
//import org.apache.commons.mail.SimpleEmail;
import trunk.model.BancoDeClientes;
import trunk.model.BancoDeCompromissos;
import trunk.model.BancoDeConvidados;
import trunk.model.Cliente;
import trunk.model.Convidado;
import trunk.model.Pacote;
import trunk.model.ProgramCliente;
import trunk.model.TipoPacote;
import trunk.model.TipoSala;
import trunk.model.TipoStatus;
import trunk.model.TipoStatusConvidado;
import trunk.model.TipoStatusEvento;
import trunk.model.calendar.Event;
import trunk.model.calendar.EventInstance;
import trunk.view.FileChooser;

import trunk.view.LoginWindow;
import trunk.view.TableModelClientes;
import trunk.view.TableModelConvidados;
import trunk.view.TelaCadastro;
import trunk.view.TelaCompromisso;
import trunk.view.TelaConvidar;
import trunk.view.TelaParticipantesON;
import trunk.view.ViewEcompCalendar;

public class UsuarioControlador implements ActionListener, MouseInputListener, KeyListener {

	private LoginWindow loginJanela;
	private TelaCadastro telaCadastro;
	private ViewEcompCalendar telaAgenda;
	private TelaCompromisso telaCompromisso;
	private TelaConvidar telaConvidar;
	private BancoDeClientes clientes;
	private BancoDeCompromissos compromissos;
	public ProgramCliente aplicacao;
	public Cliente usuario; //TODO o usuário que está armazenado só contem e-mail e senha
	public Timer timer;
	InetAddress endereco;
	private TelaParticipantesON telaParticipantesON;
	public int porta = 39688;
	public int minhasSalaVideo = 0;
	private ArrayList participantesChat = new ArrayList();
	private ArrayList participantesConf = new ArrayList();
	private ChatControlador chatcontrolador;
	private ConferenciaControlador confcontrolador;
	private boolean salasChat = false;
	private boolean salasVideo = false;



	public UsuarioControlador() {
		loginJanela = new LoginWindow(this);
		timer = new Timer();
		//  semaforo = new Semaphore(1);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		ArrayList<String> anexos = new ArrayList<String>();
		//Eventos da Janela de Login
		if (loginJanela != null && e.getSource() == loginJanela.getCancelButton()) {
			loginJanela.dispose();

		} else if (loginJanela != null && e.getSource() == loginJanela.getOkButton()) {

			String login = loginJanela.getLoginCampo().getText();
			String senha = loginJanela.getSenhaCampo().getText();
			String servidor = loginJanela.getServidorCampo().getText();

			servidor = servidor.equals("") ? "127.0.0.1" : servidor;

			if (login.equals("") || senha.equals("")) {
				JOptionPane.showMessageDialog(null, "Todos os campos precisam ser preenchidos");
			} else {

				//Pega o endereço do usuário:
				/*InetAddress endereco = null;

                try {
                endereco = InetAddress.getLocalHost();
                System.out.println("endereço IP:"+endereco);
                } catch (UnknownHostException ex) {
                System.out.println("Não conseguiu pegar o Ip do usuário- Tentou Login");
                Logger.getLogger(ChatControlador.class.getName()).log(Level.SEVERE, null, ex);
                }*/
				//VAMOS VERIFICAR SE O CLIENTE ESTÃ� CADASTRADO NO SISTEMA PRIMEIRO
				usuario = new Cliente(null, login, senha, null, porta); //Agora passa o endereço também

				//Cria um novo pacote para ser enviado par ao servidor
				Pacote pacote = new Pacote(TipoPacote.LOGIN, usuario);

				//aplicacao = new ProgramCliente(servidor, 26147,semaforo);
				aplicacao = new ProgramCliente(servidor, 26147);

				try {
					aplicacao.executaClient(); //Executa a aplicaÃ§Ã£o cliente 
					Pacote resposta = aplicacao.enviarMsn(pacote);//O mÃ©todo enviarMsn envia o pacote para o servidor e retorna uma resposta

					System.out.println(resposta.getTipo().toString());

					// Se o a confirmaÃ§Ã£o do servidor for positiva:
					if (resposta.getTipo() == TipoPacote.SUCESSO_LOGIN) {
						JOptionPane.showMessageDialog(null, "Login realizado com sucesso");

						HashMap<String, Object> aux = (HashMap<String, Object>) resposta.getConteudo();
						clientes = (BancoDeClientes) aux.get("clientes");

						compromissos = (BancoDeCompromissos) aux.get("compromissos");
						for (Cliente cliente : clientes) {
							if (cliente.getEmail().equals(usuario.getEmail())
									&& cliente.getSenha().equals(usuario.getSenha())) {
								cliente.setInetAddress(aplicacao.getConexaoCliente().getLocalAddress());
								Pacote pacote2 = new Pacote(TipoPacote.ADICIONAR_IP, cliente);
								aplicacao.enviarMsn(pacote2);
								usuario = cliente;
								System.out.println("Endereço IP:" + usuario.getInetAddress());
								break;
							}
						}

						chatcontrolador = new ChatControlador(usuario, porta, this);
						confcontrolador = new ConferenciaControlador();

						loginJanela.dispose();
						loginJanela.getLoginCampo().setText("");
						loginJanela.getSenhaCampo().setText("");
						loginJanela.getServidorCampo().setText("");
						System.out.println(clientes);
						telaAgenda = new ViewEcompCalendar(clientes, compromissos, this);
						verificarStatusTimer(); //A partir do momento que o cliente entra na agenda começa-se a atualizar o status
					}

					// Se o usuÃ¡rio nÃ£o estiver cadastrado:
					if (resposta.getTipo() == TipoPacote.NAO_CADASTRADO) {//Se o cliente não estiver cadastrado
						JOptionPane.showMessageDialog(null, "Você precisa se cadastrar primeiro");
					}

					//aplicacao.fecharConexao();

				} catch (SocketException ex) {
					JOptionPane.showMessageDialog(null, "Nãoo foi possível estabelecer uma conexão com o servidor informado!", "", JOptionPane.ERROR_MESSAGE);
				} catch (Exception ex) {
					System.out.println("Problema com a requisiÃ§Ã£o de Login -- Classe UsuarioControlador");
					Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
				}
			}

		} else //Eventos da tela da agenda
			if (telaAgenda != null && e.getSource() == telaAgenda.getNewButton()) {
				this.setUserStatus(TipoStatus.CADASTRANDO);
				telaCompromisso = new TelaCompromisso("Novo Compromisso", this);
			} else if (telaAgenda != null && e.getSource() == telaAgenda.getLogout()) {

				//Na hora do login mantive o usuario como atributo da classe para saber quem foi o usuário
				Pacote pacote = new Pacote(TipoPacote.ENCERRAR_CONEXAO_LOGOUT, usuario);
				try {
					Pacote resposta = aplicacao.enviarMsn(pacote);
					if (resposta.getTipo() == TipoPacote.SUCESSO_ENCERRAR_CONEXAO_LOGOUT) {
						System.out.println("Sucesso ao encerrar a connexÃ£o logout");
						timer.cancel();// Termina a execuÃ§Ã£o do timer corrente
						aplicacao.fecharConexao();
						telaAgenda.dispose();
						loginJanela.setVisible(true);
					}
				} catch (Exception ex) {
					System.out.println("Falha no Cliente ao tentar encerrar a conexão com logout");
					Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
				}
				//CASO O CLIENTE DESEJE ENCERRAR A SUA CONTA
			} else if (telaAgenda != null && e.getSource() == telaAgenda.getEncerrarConta()) {

				Pacote pacote = new Pacote(TipoPacote.EXCLUIR_CADASTRO, usuario);
				Pacote resposta;

				try {
					resposta = aplicacao.enviarMsn(pacote); //O método enviarMsn envia o pacote para o servidor e retorna uma resposta
					if (resposta.getTipo() == TipoPacote.SUCESSO_EXCLUIR_CADASTRO) {
						JOptionPane.showMessageDialog(null, "Sua conta foi encerrada com sucesso");
						System.out.println("Falha ao tentar encerrar a conta com logout");
						telaAgenda.dispose();
						aplicacao.fecharConexao();;
					}

				} catch (IOException ex) {
					Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
				} catch (ClassNotFoundException ex) {
					Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
				}
				//fim do teste exclusão

			} else if (telaAgenda != null && e.getSource() == telaAgenda.getSair()) {

				//Na hora do login mantive o usuario como atributo da classe para saber quem foi o usuÃ¡rio
				Pacote pacote = new Pacote(TipoPacote.ENCERRAR_CONEXAO_SAIR, usuario);
				try {
					Pacote resposta = aplicacao.enviarMsn(pacote);
					if (resposta.getTipo() == TipoPacote.SUCESSO_ENCERRAR_CONEXAO_SAIR) {
						System.out.println("Sucesso ao encerrar a connexão com SAIR");
						timer.cancel();// Termina a execuÃ§Ã£o do timer corrente
						aplicacao.fecharConexao();
						telaAgenda.dispose();
					}
				} catch (Exception ex) {
					System.out.println("Falha no Cliente ao tentar encerrar a conexão com SAIR");
					Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
				}

			} else if (telaAgenda != null && e.getSource() == telaAgenda.getEditButton()) {
				EventInstance selectedEvent = telaAgenda.getEventSelected();
				if (selectedEvent.getOwner().getEmail().equals(usuario.getEmail())
						&& selectedEvent.getOwner().getSenha().equals(usuario.getSenha())) {
					this.setUserStatus(TipoStatus.EDITANDO);
					telaCompromisso = new TelaCompromisso("Editando Compromisso", this);
					telaCompromisso.setContent(selectedEvent.getTitle(),
							selectedEvent.getDayOfMonth() + "/" + selectedEvent.getMonth() + "/" + selectedEvent.getYear(),
							selectedEvent.getHour() + ":" + selectedEvent.getMinute(),
							"00/00/0000", "00:00", selectedEvent.getLocation(),
							selectedEvent.getDescription(),
							selectedEvent.getInviteds());
				} else {
					JOptionPane.showMessageDialog(null, "Você não é o Proprietário desse Compromisso!", "Erro", JOptionPane.ERROR_MESSAGE);
				}

				//KARINE
			} else if (telaAgenda != null && e.getSource() == telaAgenda.getBatePapoButton()) {//Karine


				if (chatcontrolador.getMinhasSalasChat() < 2) {// Refere-se a quantidade de salas que o usuário já está
					BancoDeClientes ClientesON;
					Pacote pacote = new Pacote(TipoPacote.SOLICITA_ONLINES, usuario);
					try {
						Pacote resposta = aplicacao.enviarMsn(pacote);
						if (resposta.getTipo() == TipoPacote.SUCESSO_ONLINES) {


							HashMap<String, Object> aux = (HashMap<String, Object>) resposta.getConteudo();
							ClientesON = (BancoDeClientes) aux.get("clientes");
							System.out.println("Sucesso ao entregar pessoas onlines");
							//Retirando o convidador da pessoa da lista:
							ClientesON.excluirCliente(usuario);
							//Todos as outras pessoas online são mostradas na telaParticipantesON
							telaParticipantesON = new TelaParticipantesON(this, new BancoDeClientes(ClientesON), TipoSala.BATE_PAPO);


						}


					} catch (Exception ex) {
						System.out.println("Falha no Cliente ao tentar pegar lista de onlines");
						Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
					}
				} else {

					JOptionPane.showMessageDialog(telaAgenda, "Você já está em duas conversas diferentes");
				}




				//Agora veja os Eventos relacionados à telaParticipantesON

			} else if (telaAgenda != null && e.getSource() == telaAgenda.getConferenciaButton()) {//Karine


				//if (confcontrolador.getMinhasSalas_conf() < 2) {// Refere-se a quantidade de salas que o usuário já está
					BancoDeClientes ClientesON;
					Pacote pacote = new Pacote(TipoPacote.SOLICITA_ONLINES, usuario);
					try {
						Pacote resposta = aplicacao.enviarMsn(pacote);
						if (resposta.getTipo() == TipoPacote.SUCESSO_ONLINES) {


							HashMap<String, Object> aux = (HashMap<String, Object>) resposta.getConteudo();
							ClientesON = (BancoDeClientes) aux.get("clientes");
							System.out.println("Sucesso ao entregar pessoas onlines");
							//Retirando o convidador da pessoa da lista:
							ClientesON.excluirCliente(usuario);
							//Todos as outras pessoas online são mostradas na telaParticipantesON
							telaParticipantesON = new TelaParticipantesON(this, new BancoDeClientes(ClientesON), TipoSala.VIDEOCONFERENCIA);


						}


					} catch (Exception ex) {
						System.out.println("Falha no Cliente ao tentar pegar lista de onlines");
						Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
					}
				/*} else {

					JOptionPane.showMessageDialog(telaAgenda, "Você já está em duas conversas diferentes");
				}*/




				//Agora veja os Eventos relacionados à telaParticipantesON

			} else if (telaAgenda != null && e.getSource() == telaAgenda.getDeleteButton()) {
				EventInstance selectedEvent = telaAgenda.getEventSelected();
				if (selectedEvent.getOwner().getEmail().equals(usuario.getEmail())
						&& selectedEvent.getOwner().getSenha().equals(usuario.getSenha())) {
					//JOptionPane.showMessageDialog(null, "Confirmar Excluir Compromisso?", "Excluir", JOptionPane.YES_NO_OPTION);
					int response = JOptionPane.showConfirmDialog(null, "Confirmar exclusão de compromisso?", "Excluir", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
					if (response == JOptionPane.YES_OPTION) {
						int IDremover = selectedEvent.getID();
						Pacote pacote = new Pacote(TipoPacote.EXCLUIR_COMPROMISSO, IDremover);

						try {
							Pacote resposta = aplicacao.enviarMsn(pacote);
							boolean hasAttachments = !anexos.isEmpty();

							if (resposta.getTipo() == TipoPacote.SUCESSO_EXCLUIR_COMPROMISSO) {
								JOptionPane.showMessageDialog(null, "Compromisso excluído com sucesso!");
								compromissos = (BancoDeCompromissos) resposta.getConteudo();
								//compromissos.inserirCompromisso(novoEvento);
								telaAgenda.setCompromissos(compromissos);
								//telaCompromisso.dispose();
							}
						} catch (IOException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						} catch (ClassNotFoundException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						//TODO enviar e-mails para os convidados, informando do Compromisso
						//-----------------------EMAIL PARA A LISTA DE CONVIDADOS APÓS A EXCLUSÃO DE COMPROMISSO------------------------------------------------------------------
						//TODO enviar e-mails para os convidados, informando sobre a exclusão do Compromisso

						BancoDeConvidados banco = selectedEvent.getInviteds();
						if (banco != null) {// Se existir alguém no banco de convidados

							for (Convidado convidado : banco) {
								try {
									enviarEmail("ecompcalendar@gmail.com", "ecompcalendaradmin123",
											"Exclusão de Compromisso na Agenda EcompCalendar",
											"O compromisso: \"" + selectedEvent.getTitle() + "\" que você participa foi excluido da Agenda EcompCalendar por " + usuario.getNome(),
											convidado.getEmail(), "smtp.gmail.com");
								} catch (EmailException ex) {
									System.out.println("Não conseguiu enviar o email para participar de um compromisso");
									Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
								}
							}
						}
					}
				} else {
					JOptionPane.showMessageDialog(null, "Você não é o Proprietário desse Compromisso!", "Erro", JOptionPane.ERROR_MESSAGE);
				}
			} else if (telaAgenda != null && e.getSource() == telaAgenda.getConfirmarButton()) {
				EventInstance selectedEvent = telaAgenda.getEventSelected();
				BancoDeConvidados convidados = selectedEvent.getInviteds();
				boolean hasAttachments = !anexos.isEmpty();
				Convidado novoConvidado = new Convidado(usuario.getNome(), usuario.getEmail(),
						usuario.getSenha(), TipoStatusConvidado.CONFIRMADO);
				convidados.setStatusConvidado(novoConvidado);

				telaAgenda.setInviteds(convidados);
				telaAgenda.setConfirmarButtonEnable(false);

				int IDremover = selectedEvent.getID();
				Event novoEvento = new Event(
						selectedEvent.getTitle(),
						selectedEvent.getDescription(),
						selectedEvent.getLocation(),
						selectedEvent.getYear(),
						selectedEvent.getMonth(),
						selectedEvent.getDayOfMonth(),
						selectedEvent.getHour(),
						selectedEvent.getMinute(), 0, true, false,
						selectedEvent.getOwner(), convidados, hasAttachments, anexos);

				if (convidados.getNumeroConfirmados() > convidados.size() * 0.9) {
					novoEvento.setStatus(TipoStatusEvento.CONFIRMADO);
					//TODO mandar e-mail confirmando a realização do evento ------ KARINE
					if (convidados != null) {
						BancoDeConvidados banco = convidados;

						for (Convidado convidado : banco) {
							try {
								enviarEmail("ecompcalendar@gmail.com", "ecompcalendaradmin123",
										"Confirmação de um compromisso da Agenda EmcompCalender",
										"O seguinte compromisso está cofirmado: \""
										+ selectedEvent.getTitle(),
										convidado.getEmail(), "smtp.gmail.com");
							} catch (EmailException ex) {
								System.out.println("Não foi possível confirmar o compromisso com 90% de confirmação em participação");
								Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
							}
						}

					}
				}

				HashMap<String, Object> conteudo = new HashMap<String, Object>();
				conteudo.put("IDremover", IDremover);
				conteudo.put("evento", novoEvento);

				Pacote pacote = new Pacote(TipoPacote.EDITAR_COMPROMISSO, conteudo);

				try {
					Pacote resposta = aplicacao.enviarMsn(pacote);

					if (resposta.getTipo() == TipoPacote.SUCESSO_NOVO_COMPROMISSO) {
						JOptionPane.showMessageDialog(null, "Participação Confirmada!");
						compromissos = (BancoDeCompromissos) resposta.getConteudo();
						//compromissos.inserirCompromisso(novoEvento);
						telaAgenda.setCompromissos(compromissos);
						//telaCompromisso.dispose();
						//this.setUserStatus(TipoStatus.ONLINE);
					}
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

			} else if (telaAgenda != null && e.getSource() == telaAgenda.getSair()) {
				//TODO fechar as conexÃµes e os fluxos (tanto de rede quando de arquivo)
				System.exit(0);
			} else if (telaCompromisso != null && e.getSource() == telaCompromisso.getSalvarBotao()) {
				String titulo = telaCompromisso.getTituloCampo().getText();
				String dataInicio = telaCompromisso.getDataInicioCampo().getText();
				String horaInicio = telaCompromisso.getHoraInicioCampo().getText();
				String dataFim = telaCompromisso.getDataFimCampo().getText();
				String horaFim = telaCompromisso.getHoraFimCampo().getText();
				String descricao = telaCompromisso.getDescricaoCampo().getText();
				String local = telaCompromisso.getLocalCampo().getText();

				int Di, Mi, Yi, hi, mi;

				String[] split = dataInicio.split("/");
				Di = Integer.valueOf(split[0]);
				Mi = Integer.valueOf(split[1]);
				Yi = Integer.valueOf(split[2]);

				split = horaInicio.split(":");
				hi = Integer.valueOf(split[0]);
				mi = Integer.valueOf(split[1]);

				BancoDeConvidados convidados = telaCompromisso.getConvidados();
				boolean hasAttachments = !anexos.isEmpty();
				EventInstance selectedEvent = telaAgenda.getEventSelected();
				//Se não há evento selecionado, é evento novo
				if (selectedEvent == null) {

					Event novoEvento = new Event(titulo, descricao, local, Yi, Mi,
							Di, hi, mi, 0, true, false, usuario, convidados, hasAttachments, anexos);

					Pacote pacote = new Pacote(TipoPacote.CADASTRAR_COMPROMISSO, novoEvento);

					try {
						Pacote resposta = aplicacao.enviarMsn(pacote);

						if (resposta.getTipo() == TipoPacote.SUCESSO_NOVO_COMPROMISSO) {
							JOptionPane.showMessageDialog(null, "Compromisso cadastrado com sucesso!");
							compromissos = (BancoDeCompromissos) resposta.getConteudo();
							//compromissos.inserirCompromisso(novoEvento);
							telaAgenda.setCompromissos(compromissos);
							telaCompromisso.dispose();
							this.setUserStatus(TipoStatus.ONLINE);
						}
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					//TODO enviar e-mails para os convidados, informando do Compromisso

					//-----------------------EMAIL PARA A LISTA DE CONVIDADOS APÓS A CADASTRO DE COMPROMISSO----------------------------
					//TODO enviar e-mails para os convidados, informando sonre o cadastro do Compromisso
					if (convidados != null) {
						BancoDeConvidados banco = convidados;

						try {
							for (Convidado convidado : banco) {
								enviarEmail("ecompcalendar@gmail.com", "ecompcalendaradmin123",
										"Convite para participar de um novo compromisso",
										"Você está sendo convidado a participar do compromisso: \"" + titulo + "\" na Agenda EcompCalendar. Criado por: " + usuario.getNome(),
										convidado.getEmail(), "smtp.gmail.com");
							}
						} catch (EmailException ex) {
							System.out.println("Não conseguiu enviar email avisando que novo compromisso foi cadastrado");
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
						}
					}
				} else { //Se há evento selecionado, é edição de evento
					int IDremover = selectedEvent.getID();
					Event novoEvento = new Event(titulo, descricao, local, Yi, Mi,
							Di, hi, mi, 0, true, false, usuario, convidados, hasAttachments, anexos);

					HashMap<String, Object> conteudo = new HashMap<String, Object>();
					conteudo.put("IDremover", IDremover);
					conteudo.put("evento", novoEvento);

					Pacote pacote = new Pacote(TipoPacote.EDITAR_COMPROMISSO, conteudo);

					try {
						Pacote resposta = aplicacao.enviarMsn(pacote);

						if (resposta.getTipo() == TipoPacote.SUCESSO_NOVO_COMPROMISSO) {
							JOptionPane.showMessageDialog(null, "Compromisso editado com sucesso!");
							compromissos = (BancoDeCompromissos) resposta.getConteudo();
							//compromissos.inserirCompromisso(novoEvento);
							telaAgenda.setCompromissos(compromissos);
							telaCompromisso.dispose();
							this.setUserStatus(TipoStatus.ONLINE);
						}
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					//-----------------------EMAIL PARA A LISTA DE CONVIDADOS APÓS A EDIÇÃO-------------------------------------------------------------------------------------------
					//TODO enviar e-mails para os convidados, informando da edição do Compromisso
					if (convidados != null) {
						BancoDeConvidados banco = convidados;
						try {
							for (Convidado convidado : banco) {
								enviarEmail("ecompcalendar@gmail.com", "ecompcalendaradmin123",
										"Um compromisso foi editado na Agenda EcompCalendar por",
										"Houve alteração no Compromisso: \"" + titulo + "\" da Agenda EcompCalendar. Alterado por: " + usuario.getNome(),
										convidado.getEmail(), "smtp.gmail.com");
							}
						} catch (EmailException ex) {
							System.out.println("Não conseguiu enviar avisando que editou um compromisso");
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
						}
					}
				}
			} else if (telaCompromisso != null && e.getSource() == telaCompromisso.getConvidarBotao()) {
				telaCompromisso.setEnabled(false);
				telaConvidar = new TelaConvidar(this, new BancoDeConvidados(clientes));
			} else if (telaCompromisso != null && e.getSource() == telaCompromisso.getDescartarBotao()) {
				telaCompromisso.dispose();
				this.setUserStatus(TipoStatus.ONLINE);

				//SE O CLIENTE PEDIR PARA EXCLUIR UM COMPROMISSO
				//TODO SERÁ MAIS O MENOS ASSIM A EXCLUSÃO DE CADASTRO
			} else if (telaCompromisso != null && e.getSource() == telaCompromisso.getAnexoBotao()) {

				Pacote pacote = new Pacote(TipoPacote.ENVIAR_ANEXO_SERVIDOR, "Anexo");
				try {
					FileChooser fileChooser = new FileChooser();
					File file = fileChooser.getFile();
					if (file != null) {
						Pacote resposta = aplicacao.enviarMsn(pacote);
						telaCompromisso.setAnexo1Campo(file.getName());
						aplicacao.enviarAnexoServidor(file);
					}
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				//KARINE://Eventos da TelaParticipantesON:                            
			} else if (telaParticipantesON != null && e.getSource() == telaParticipantesON.getAdd()) {


				JTable toInvite = telaParticipantesON.getToInvite();
				Cliente cliente = (Cliente) ((TableModelClientes) toInvite.getModel()).getSelectedObject(toInvite.getSelectedRow());
				BancoDeClientes clientesOld = telaParticipantesON.getUsuarios();
				clientesOld.excluirCliente(cliente);
				telaParticipantesON.setUsuarios(clientesOld);


				BancoDeClientes clientesNew = telaParticipantesON.getConvidados();
				clientesNew.inserirCliente(cliente);
				telaParticipantesON.setConvidados(clientesNew);

			} else if (telaParticipantesON != null && e.getSource() == telaParticipantesON.getAddAll()) {

				BancoDeClientes clientesOld = telaParticipantesON.getUsuarios();
				BancoDeClientes clientesNew = telaParticipantesON.getConvidados();
				clientesNew.inserirClientes(clientesOld);
				clientesOld.excluirClientes(clientesOld);
				telaParticipantesON.setUsuarios(clientesOld);
				telaParticipantesON.setConvidados(clientesNew);

			} else if (telaParticipantesON != null && e.getSource() == telaParticipantesON.getRemove()) {
				JTable inviteds = telaParticipantesON.getInviteds();
				Cliente cliente = (Cliente) ((TableModelClientes) inviteds.getModel()).getSelectedObject(inviteds.getSelectedRow());
				BancoDeClientes clientesNew = telaParticipantesON.getConvidados();
				clientesNew.excluirCliente(cliente);
				telaParticipantesON.setConvidados(clientesNew);

				BancoDeClientes clientesOld = telaParticipantesON.getUsuarios();
				clientesOld.inserirCliente(cliente);
				telaParticipantesON.setUsuarios(clientesOld);

			} else if (telaParticipantesON != null && e.getSource() == telaParticipantesON.getRemoveAll()) {
				BancoDeClientes clientesOld = telaParticipantesON.getUsuarios();
				BancoDeClientes clientesNew = telaParticipantesON.getConvidados();
				clientesOld.inserirClientes(clientesNew);
				clientesNew.excluirClientes(clientesNew);
				telaParticipantesON.setUsuarios(clientesOld);
				telaParticipantesON.setConvidados(clientesNew);

			} else if (telaParticipantesON != null && e.getSource() == telaParticipantesON.getCancelar()) {
				System.out.println("o sistema está rolando");
				telaParticipantesON.dispose();

			} else if (telaParticipantesON != null && e.getSource() == telaParticipantesON.getConvidar()) {

				BancoDeClientes clientesConvidar = telaParticipantesON.getConvidados();




				if (clientesConvidar.size() > 0 && clientesConvidar.size() < 3) {
					if(telaParticipantesON.getTipoSala() == TipoSala.BATE_PAPO){
						// telaParticipantesON.setEnabled(true);
						// telaParticipantesON.setConvidados(clientesConvidar);
						telaParticipantesON.dispose();


						for (Cliente cli : clientesConvidar) {
							System.out.println("Nome e Endereço IP do convidado para chat: " + cli.getNome() + " " + cli.getInetAddress());
						}

						//KARINE:
						//SE a REQUISIÇÃO FOR PARA UMA SALA DE BATE-PAPO
						Pacote pacote = new Pacote(TipoPacote.REQUISITAR_SALA_CHAT, usuario);
						try {
							Pacote resposta = aplicacao.enviarMsn(pacote);
							if (resposta.getTipo() == TipoPacote.TEM_SALA_CHAT) {
								System.out.println("REQUISIÇÃO PARA SALA DE CHAT ACEITA");
								salasChat = true;
							} else if (resposta.getTipo() == TipoPacote.NEGADO_SALA_CHAT) {

								System.out.println("REQUISIÇÃO PARA SALA DE CHAT NEGADA");
								salasChat = false;
							}
						} catch (Exception ex) {
							System.out.println("REQUISIÇÃO PARA SALA DE CHAT NÃO FOI ACEITA");
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
						}
						try {
							//YCARO:
							//REQUISIÇAO DE CONVITES
							participantesChat = enviarConvite(clientesConvidar, TipoSala.BATE_PAPO);
						} catch (IOException ex) {
							System.out.println("Erro não enviar convite para os participantes");
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
						} catch (ClassNotFoundException ex) {
							System.out.println("Erro não enviar convite para os participantes");
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
						}

						try { //Condições para começar ou não o bate-papo:




							if (salasChat == true && !participantesChat.isEmpty()) { // Tem sala disponível e participantes existem


								enviarParticipantes(participantesChat, TipoSala.BATE_PAPO);
								chatcontrolador.startChat(participantesChat);
								chatcontrolador.IncrementeMinhasSalasChat(); // O usuário que convidou incrmenta sua conta de sala


							} else if (salasChat == false && !participantesChat.isEmpty()) { //Não tem sala disponível e participantes  existirem 

								JOptionPane.showMessageDialog(telaAgenda, "Aceitaram o seu convite, mas não há salas disponíveis para bate-papo");
							} else if (salasChat == false && participantesChat.isEmpty()) { //Não tem sala disponível e participantes  não existirem

								JOptionPane.showMessageDialog(telaAgenda, "Não há salas disponíveis para bate-papo e ninguém aceitou seu convite");
							} else if (salasChat == true && participantesChat.isEmpty()) { // Tem sala disponível e não existe participantes
								//liberar a sala para o servidor
								JOptionPane.showMessageDialog(telaAgenda, "Nenhum convidado aceitou o seu convite");
				                   
                                                                //KARINE: //SE a REQUISIÇÃO FOR PARA LIBERAÇÃO DE UMA SALA DE BATE-PAPO:
                                                                chatcontrolador.liberar_Sala_Chat();
		                        
		                    }

						} catch (IOException ex) {
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
							System.out.println("Erro no enviar participantes o chat \n" + ex);
						} catch (ClassNotFoundException ex) {
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
							System.out.println("Erro no enviar participantes o chat \n" + ex);
						}
					}  else if(telaParticipantesON.getTipoSala() == TipoSala.VIDEOCONFERENCIA){
						// telaParticipantesON.setEnabled(true);
						// telaParticipantesON.setConvidados(clientesConvidar);
						telaParticipantesON.dispose();


						for (Cliente cli : clientesConvidar) {
							System.out.println("Nome e Endereço IP do convidado para chat: " + cli.getNome() + " " + cli.getInetAddress());
						}


						//KARINE:
						//SE a REQUISIÇÃO FOR PARA UMA SALA DE BATE-PAPO
						Pacote pacote = new Pacote(TipoPacote.REQUISITAR_SALA_VIDEO, "REQUISITAR_SALA_VIDEO");
						try {
							Pacote resposta = aplicacao.enviarMsn(pacote);
							if (resposta.getTipo() == TipoPacote.TEM_SALA_VIDEO) {
								System.out.println("REQUISIÇÃO PARA SALA DE VIDEO ACEITA");
								salasVideo = true;
							} else if (resposta.getTipo() == TipoPacote.NEGADO_SALA_VIDEO) {

								System.out.println("REQUISIÇÃO PARA SALA DE VIDEO NEGADA");
								salasVideo = false;
							}
						} catch (Exception ex) {
							System.out.println("REQUISIÇÃO PARA SALA DE VIDEO NÃO FOI ACEITA");
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
						}
						try {
							//YCARO:
							//REQUISIÇAO DE CONVITES
							participantesConf = enviarConvite(clientesConvidar, TipoSala.VIDEOCONFERENCIA);
						} catch (IOException ex) {
							System.out.println("Erro não enviar convite para os participantes");
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
						} catch (ClassNotFoundException ex) {
							System.out.println("Erro não enviar convite para os participantes");
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
						}

						try { //Condições para começar ou não o bate-papo:




							if (salasVideo == true && !participantesConf.isEmpty()) { // Tem sala disponível e participantes existem


								enviarParticipantes(participantesConf, TipoSala.VIDEOCONFERENCIA);
								confcontrolador.startConf(participantesChat);

							} else if (salasVideo == false && !participantesConf.isEmpty()) { //Não tem sala disponível e participantes  existirem 

								JOptionPane.showMessageDialog(telaAgenda, "Aceitaram o seu convite, mas não há salas disponíveis para bate-papo");
							} else if (salasVideo == false && participantesConf.isEmpty()) { //Não tem sala disponível e participantes  não existirem

								JOptionPane.showMessageDialog(telaAgenda, "Não há salas disponíveis para bate-papo e ninguém aceitou seu convite");
							} else if (salasVideo == true && participantesChat.isEmpty()) { // Tem sala disponível e não existe participantes
								liberar_Sala_Video();//liberar a sala para o servidor
								JOptionPane.showMessageDialog(telaAgenda, "Nenhum convidado aceitou o seu convite");
							}

						} catch (IOException ex) {
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
							System.out.println("Erro no enviar participantes na conferencia \n" + ex);
						} catch (ClassNotFoundException ex) {
							Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
							System.out.println("Erro no enviar participantes na conferencia \n" + ex);
						}
					}
				} else {
					JOptionPane.showMessageDialog(telaParticipantesON, "Só é permitido 2 ou 1 convidado ao chat");
				}

			} else if (telaConvidar != null && e.getSource() == telaConvidar.getAdd()) {
				JTable toInvite = telaConvidar.getToInvite();
				Convidado cliente = (Convidado) ((TableModelConvidados) toInvite.getModel()).getSelectedObject(toInvite.getSelectedRow());
				BancoDeConvidados clientesOld = telaConvidar.getUsuarios();
				clientesOld.excluirCliente(cliente);
				telaConvidar.setUsuarios(clientesOld);

				BancoDeConvidados clientesNew = telaConvidar.getConvidados();
				clientesNew.inserirCliente(cliente);
				telaConvidar.setConvidados(clientesNew);
			} else if (telaConvidar != null && e.getSource() == telaConvidar.getAddAll()) {
				BancoDeConvidados clientesOld = telaConvidar.getUsuarios();
				BancoDeConvidados clientesNew = telaConvidar.getConvidados();
				clientesNew.inserirClientes(clientesOld);
				clientesOld.excluirClientes(clientesOld);
				telaConvidar.setUsuarios(clientesOld);
				telaConvidar.setConvidados(clientesNew);
			} else if (telaConvidar != null && e.getSource() == telaConvidar.getRemove()) {
				JTable inviteds = telaConvidar.getInviteds();
				Convidado cliente = (Convidado) ((TableModelConvidados) inviteds.getModel()).getSelectedObject(inviteds.getSelectedRow());
				BancoDeConvidados clientesNew = telaConvidar.getConvidados();
				clientesNew.excluirCliente(cliente);
				telaConvidar.setConvidados(clientesNew);

				BancoDeConvidados clientesOld = telaConvidar.getUsuarios();
				clientesOld.inserirCliente(cliente);
				telaConvidar.setUsuarios(clientesOld);
			} else if (telaConvidar != null && e.getSource() == telaConvidar.getRemoveAll()) {
				BancoDeConvidados clientesOld = telaConvidar.getUsuarios();
				BancoDeConvidados clientesNew = telaConvidar.getConvidados();
				clientesOld.inserirClientes(clientesNew);
				clientesNew.excluirClientes(clientesNew);
				telaConvidar.setUsuarios(clientesOld);
				telaConvidar.setConvidados(clientesNew);
			} else if (telaConvidar != null && e.getSource() == telaConvidar.getCancelar()) {
				telaCompromisso.setEnabled(true);
				telaConvidar.dispose();
			} else if (telaConvidar != null && e.getSource() == telaConvidar.getConvidar()) {
				BancoDeConvidados clientesConvidar = telaConvidar.getConvidados();
				telaCompromisso.setEnabled(true);
				telaCompromisso.setConvidados(clientesConvidar);
				telaConvidar.dispose();

			} else //Eventos da Tela de Cadastro
				if (telaCadastro != null && e.getSource() == telaCadastro.getCancelButton()) {
					telaCadastro.dispose();
					loginJanela.setVisible(true);
				} //Se o evento for do botÃ£o CADASTRAR de TelaCadastro:
				else if (telaCadastro != null && e.getSource() == telaCadastro.getCadastroButton()) {

					//Captura dos dados da tela de Cadastro:
					String nome = telaCadastro.getCampoNome().getText();
					String email = telaCadastro.getCampoEmail().getText();
					String senha = telaCadastro.getCampoSenha().getText();
					String confirmaSenha = telaCadastro.getCampoConfirmarSenha().getText();

					//Se algum campo estiver vazio:
					if (senha.equals("") || nome.equals("") || email.equals("")) {
						JOptionPane.showMessageDialog(null, "Todos os campos precisam ser preenchidos");
					} else {
						//Verifica se a senha é igual a senha confirmada:
						if (senha.equals(confirmaSenha) && !senha.equals("")) {

							//Cria novo cliente:
							Cliente novoCliente = new Cliente(nome, email, senha);

							//Cria um novo pacote:
							Pacote pacote = new Pacote(TipoPacote.CADASTRO, novoCliente);

							//Esse trecho cria uma nova conexao e envia novo cliente 
							// e  o pacote Envia pacote para o servidor:
							//aplicacao = new ProgramCliente("127.0.0.1", 26147,semaforo);
							aplicacao = new ProgramCliente("127.0.0.1", 26147);

							try {
								aplicacao.executaClient(); //Executa a aplicação cliente
								Pacote resposta = aplicacao.enviarMsn(pacote);//O método EnviarMsn envia o pacote para o servidor e retorna uma resposta
								aplicacao.fecharConexao();
								if (resposta.getTipo() == TipoPacote.SUCESSO_CADASTRO) { // Se o a confirmaÃ§Ã£o do servidor for positiva:
									JOptionPane.showMessageDialog(null, "Cadastro realizado com sucesso");
									telaCadastro.dispose();
									loginJanela.setVisible(true); // Volta a tela de login
								}


							} catch (Exception ex) {
								System.out.println("Problema com a requisição de cadastro -- Classe UsuarioControlador");
								Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
							}

						} else {
							JOptionPane.showMessageDialog(null, "Digite novamente a senha e confirme");

						}

					}

				}
	}
    
public boolean liberar_Sala_Video() {

        //SE a REQUISIÇÃO FOR PARA LIBERAÇÃO DE UMA SALA DE BATE-PAPO
        Pacote liberar = new Pacote(TipoPacote.LIBERAR_SALA_VIDEO, "LIBERAR_SALA_VIDEO");

        try {
            Pacote resposta = aplicacao.enviarMsn(liberar);
            if (resposta.getTipo() == TipoPacote.SALA_VIDEO_LIBERADA) {
                System.out.println("A SALA DE VIDEO FOI LIBERADA");
                return true;
            } else{
                System.out.println("A SALA DE VIDEO NAO FOI LIBERADA");
                return false;
            }
        } catch (Exception ex) {

            System.out.println("NÃO CONSEGUIU LIBERAR A SALA");
            Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("A SALA DE CHAT NAO FOI LIBERADA2");
        return false;
    }

    public ArrayList enviarConvite(BancoDeClientes clientesConvidar, TipoSala tipoSala) throws IOException, ClassNotFoundException {
		//Verifica se somente existe 2 ou menos convidados caso exista mais retorna null


		ArrayList participantes = new ArrayList();
		System.out.println(clientesConvidar.size() + " " + clientesConvidar.getCliente(0).getNome() + " " + clientesConvidar.getCliente(0).getPorta());
		//Verifica se tem 1 ou 2 convidados
		if (clientesConvidar.size() == 1) {
			//Cria conexão com o convidado e obtem os canais de comunicação
			Cliente part1 = clientesConvidar.getCliente(0);
			System.out.println("convidando: "+part1.getInetAddress()+":"+part1.getPorta());
			Socket socketPart1 = new Socket(part1.getInetAddress(), part1.getPorta());
			ObjectInputStream input = new ObjectInputStream(socketPart1.getInputStream());
			ObjectOutputStream output = new ObjectOutputStream(socketPart1.getOutputStream());
			// Envia o convite
			System.out.println("Antes Envia o convite");
			Pacote mensagem = null;
			if(tipoSala == TipoSala.BATE_PAPO) mensagem = new Pacote(TipoPacote.CONVITE_CHAT, "CONVITE_CHAT");
			else if(tipoSala == TipoSala.VIDEOCONFERENCIA) mensagem = new Pacote(TipoPacote.CONVITE_VIDEO, "CONVITE_VIDEO");
			output.writeObject(mensagem);
			output.flush();
			System.out.println("Envia o convite");
			// Recebe a resposta
			Pacote pacoteresposta = (Pacote) input.readObject(); // Ler a mensagem do servidor
			//Se for aceito adiciona o convidado a uma lista de participantes
			System.out.println("Recebe a resposta");
			if (pacoteresposta.getTipo() == TipoPacote.CONVITE_ACEITO || pacoteresposta.getTipo() == TipoPacote.CONVITE_VIDEO_ACEITO) {                    
				participantes.add(part1);// Se aceitar o convite, adiciona na lista o cliente que aceitou
			}
			// Envia mensagem falando para encerra conexão do lado do convidado
			mensagem = new Pacote(TipoPacote.ENCERRAR_CONEXAO_SAIR, "ENCERRAR_CONEXAO");
			output.writeObject(mensagem);
			output.flush();
			System.out.println("Encerra conexão");
			// Encerra conexão 
			input.close();
			output.close();
			socketPart1.close();

		} else if(clientesConvidar.size() == 2){
			//Repete a mesma operação anterior, com diferença que agora está duplicado, um para cada participante
			Cliente part1 = clientesConvidar.getCliente(0);
			Cliente part2 = clientesConvidar.getCliente(1);

			Socket socketPart1 = new Socket(part1.getInetAddress(), part1.getPorta());
			//teste1
			System.out.println(part1.getInetAddress().toString() + "e" + part1.getPorta());

			ObjectInputStream inputSocketPart1 = new ObjectInputStream(socketPart1.getInputStream());

			ObjectOutputStream outputSocketPart1 = new ObjectOutputStream(socketPart1.getOutputStream());

			Pacote mensagem = new Pacote(TipoPacote.CONVITE_CHAT, "CONVITE_CHAT");
			outputSocketPart1.writeObject(mensagem);
			outputSocketPart1.flush();

			Socket socketPart2 = new Socket(part2.getInetAddress(), part2.getPorta());
			//teste2
			System.out.println(part2.getInetAddress().toString() + "e" + part2.getPorta());
			ObjectInputStream inputSocketPart2 = new ObjectInputStream(socketPart2.getInputStream());
			ObjectOutputStream outputSocketPart2 = new ObjectOutputStream(socketPart2.getOutputStream());

			Pacote mensagem2 = new Pacote(TipoPacote.CONVITE_CHAT, "CONVITE_CHAT");
			outputSocketPart2.writeObject(mensagem2);
			outputSocketPart2.flush();

			Pacote pacoteresposta = (Pacote) inputSocketPart1.readObject();
			Pacote pacoteresposta2 = (Pacote) inputSocketPart2.readObject();


			if (pacoteresposta.getTipo() == TipoPacote.CONVITE_ACEITO) {

				participantes.add(part1);
			}
			if (pacoteresposta2.getTipo() == TipoPacote.CONVITE_ACEITO) {

				participantes.add(part2);

			} 

			mensagem = new Pacote(TipoPacote.ENCERRAR_CONEXAO_SAIR, "ENCERRAR_CONEXAO");
			outputSocketPart1.writeObject(mensagem);
			outputSocketPart1.flush();
			outputSocketPart1.close();
			inputSocketPart1.close();
			socketPart1.close();

			mensagem2 = new Pacote(TipoPacote.ENCERRAR_CONEXAO_SAIR, "ENCERRAR_CONEXAO");
			outputSocketPart2.writeObject(mensagem2);
			outputSocketPart2.flush();
			outputSocketPart2.close();
			inputSocketPart2.close();
			socketPart2.close();
		}

		return participantes;


	}

	public void enviarParticipantes(ArrayList<Cliente> participantesChatConf, TipoSala tipoSala) throws IOException, ClassNotFoundException {
		//Verifica se somente existe 2 ou menos convidados caso exista mais retorna null


		ArrayList participantes = new ArrayList();

		//Verifica se tem 1 ou 2 convidados
		if (participantesChatConf.size() == 1) {
			//Cria conexão com o convidado e obtem os canais de comunicação
			Cliente part1 = participantesChatConf.get(0);
			Socket socketPart1 = new Socket(part1.getInetAddress(), part1.getPorta());
			ObjectInputStream input = new ObjectInputStream(socketPart1.getInputStream());
			ObjectOutputStream output = new ObjectOutputStream(socketPart1.getOutputStream());
			// Envia o convite
			participantes = new ArrayList(participantesChatConf);
			participantes.remove(part1);
			participantes.add(usuario);
			Pacote mensagem = null;
			if(tipoSala == TipoSala.BATE_PAPO) mensagem = new Pacote(TipoPacote.START_CHAT, participantes);
			else if(tipoSala == TipoSala.VIDEOCONFERENCIA) mensagem = new Pacote(TipoPacote.START_VIDEO, participantes);
			output.writeObject(mensagem);
			output.flush();

			// Envia mensagem falando para encerra conexão do lado do convidado
			mensagem = new Pacote(TipoPacote.ENCERRAR_CONEXAO_SAIR, "ENCERRAR_CONEXAO");
			output.writeObject(mensagem);
			output.flush();
			System.out.println("Encerra conexão");
			// Encerra conexão 
			input.close();
			output.close();
			socketPart1.close();

		} else {
			//Repete a mesma operação anterior, com diferença que agora está duplicado, um para cada participante
			Cliente part1 = participantesChatConf.get(0);
			Cliente part2 = participantesChatConf.get(1);

			Socket socketPart1 = new Socket(part1.getInetAddress(), part1.getPorta());
			ObjectInputStream inputSocketPart1 = new ObjectInputStream(socketPart1.getInputStream());
			ObjectOutputStream outputSocketPart1 = new ObjectOutputStream(socketPart1.getOutputStream());


			participantes.add(part2);
			participantes.add(usuario);

			Pacote mensagem = new Pacote(TipoPacote.START_CHAT, participantes);
			outputSocketPart1.writeObject(mensagem);
			outputSocketPart1.flush();

			Socket socketPart2 = new Socket(part2.getInetAddress(), part2.getPorta());
			ObjectInputStream inputSocketPart2 = new ObjectInputStream(socketPart2.getInputStream());
			ObjectOutputStream outputSocketPart2 = new ObjectOutputStream(socketPart2.getOutputStream());

			participantes = new ArrayList();

			participantes.add(part1);
			participantes.add(usuario);

			Pacote mensagem2 = new Pacote(TipoPacote.START_CHAT, participantes);
			outputSocketPart2.writeObject(mensagem2);
			outputSocketPart2.flush();

			mensagem = new Pacote(TipoPacote.ENCERRAR_CONEXAO_SAIR, "ENCERRAR_CONEXAO");
			outputSocketPart1.writeObject(mensagem);
			outputSocketPart1.flush();
			outputSocketPart1.close();
			inputSocketPart1.close();
			socketPart1.close();

			mensagem2 = new Pacote(TipoPacote.ENCERRAR_CONEXAO_SAIR, "ENCERRAR_CONEXAO");
			outputSocketPart2.writeObject(mensagem2);
			outputSocketPart2.flush();
			outputSocketPart2.close();
			inputSocketPart2.close();
			socketPart2.close();
		}
	}

	public void enviarEmail(String emailRemetente, String senhaRemetente, String assunto,
			String mensagem, String paraEmail, String servidorSMTP) throws EmailException {


		SimpleEmail email = new SimpleEmail();

		email.setSSL(true);
		email.setTLS(true);
		email.setSmtpPort(465);
		email.setHostName(servidorSMTP);//("smtp.somedomain.com"); Ex: "smtp.gmail.com" //o servidor SMTP para envio do e-mail
		email.setFrom(emailRemetente);//remetente e nome (se quiser)
		email.setAuthentication(emailRemetente, senhaRemetente);
		email.addTo(paraEmail);
		//email.addCc("someone2@somedomain.com");
		//.addBcc("someone3@somedomain.com");
		email.setSubject(assunto);
		email.setMsg(mensagem);
		email.send();
	}

	//TIMER QUE REALIZA O PEDIDO DE VERIFICAÃ‡ÃƒO DE STATUS A CADA 5 SEGUNDOS----------------------------------------------
	public void verificarStatusTimer() {

		timer.schedule(new TimerTask() {

			@Override
			public void run() {

				verificarStatus();

			}
		}, 0, 5000); //==}0,5000);
	}

	public void verificarStatus() {

		Pacote pacote = new Pacote(TipoPacote.ATUALIZAR_STATUS, "ATUALIZAR_STATUS");
		try {
			Pacote resposta = aplicacao.enviarMsn(pacote);
			if (resposta.getTipo() == TipoPacote.SUCESSO_ATUALIZAR_STATUS) {

				HashMap<String, Object> aux = (HashMap<String, Object>) resposta.getConteudo();
				clientes = new BancoDeClientes((BancoDeClientes) aux.get("clientes"));
				compromissos = (BancoDeCompromissos) aux.get("compromissos");
				telaAgenda.setBancoDeClientes(clientes); //Atualiza Clientes na tela agenda
				telaAgenda.setCompromissos(compromissos);//Atualiza Compromissos na tela agenda    

				// System.out.println(clientes.toString());
				//System.out.println(compromissos.toString());
				// System.out.println("Atualizando para conexão de porta: " + aplicacao.getPortaConexao());
				/* for (Cliente cliente : clientes) {
                    System.out.println(cliente.getNome() + " status:" + cliente.getStatus());
                }*/

				System.out.println("Status Atualizado para :" + usuario.getEmail());
			}
		} catch (Exception ex) {
			System.out.println("Falha ao tentar verificar todos os status com o mÃ©todo verificarStatus()");
			Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
		}
	}

	public void setUserStatus(TipoStatus novoStatus) {
		Cliente clienteNovoStatus = new Cliente(usuario.getNome(), usuario.getEmail(),
				usuario.getSenha(), novoStatus);
		Pacote pacote = new Pacote(TipoPacote.ALTERAR_STATUS, clienteNovoStatus);
		try {
			Pacote resposta = aplicacao.enviarMsn(pacote);
			if (resposta.getTipo() == TipoPacote.SUCESSO_ALTERAR_STATUS) {

				clientes = new BancoDeClientes((BancoDeClientes) resposta.getConteudo());
				telaAgenda.setBancoDeClientes(clientes); //Atualiza Clientes na tela agenda
			}
		} catch (Exception ex) {
			System.out.println("Falha ao tentar verificar todos os status com o mÃ©todo verificarStatus()");
			Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		if (e.getSource() == loginJanela.getCadastro()) {

			telaCadastro = new TelaCadastro(this);
			telaCadastro.setVisible(true);
			loginJanela.setVisible(false);
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
	}

	@Override
	public void mouseReleased(MouseEvent e) {
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}

	@Override
	public void mouseDragged(MouseEvent e) {
	}

	@Override
	public void mouseMoved(MouseEvent e) {
	}

	@Override
	public void keyTyped(KeyEvent e) {
	}

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
			loginJanela.getOkButton().doClick();
		} else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
			loginJanela.getCancelButton().doClick();
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
	}
}//FIM DA CLASSE UsuarioControlador
